package cn.tedu.service.port;

import cn.tedu.entity.Goods;

import java.util.List;

public interface GoodsService {

    /**
     * 查询商品列表时默认的排序方式
     */
    String ORDER_BY_DEFAULT = "priority desc";

    /**
     * 查询商品列表时默认的排序方式
     */
    String ORDER_BY_PRICE_ASC = "price ASC";

    /**
     * 查询商品列表时默认的排序方式
     */
    String ORDER_BY_PRICE_DESC = "price DESC";

    /**
     * 每页显示多少条数据
     */
    Integer COUNT_PER_PAGE = 20;

    /**
     * 排序方案
     */
    String[] ORDER_BY = {
            ORDER_BY_DEFAULT,
            ORDER_BY_PRICE_ASC,
            ORDER_BY_PRICE_DESC};

//-------------------------------------------------------//

    /**
     * 设置每页显示的商品数量
     * @param countPerPage 每页显示的商品数量
     */
    void setCountPerPage(int countPerPage);

    /**
     * 获取每页显示的商品数量
     * @return 每页显示的商品数量
     */
    Integer getCountPerPage();

    /**
     * 根据商品分类获取商品列表
     * @param categoryId    分类id
     * @param orderBy       排序
     * @param offset        偏移量，即跳过前面的多少条数据，如果从头开始获取则设置为0
     * @param count         获取数据的数量
     * @return              商品分类列表
     */
    List<Goods> getGoodsListByCategoryId(
            Integer categoryId,
            String orderBy,
            Integer offset,
            Integer count);

    /**
     * 根据商品分类获取商品列表
     * @param categoryId   分类id
     * @param offset       偏移量，即跳过前面的多少条数据，如果从头开始获取则设置为0
     * @param count        获取数据的数量
     * @return             商品分类列表
     */
    List<Goods> getGoodsListByCategoryId(
            Integer categoryId,
            Integer offset,
            Integer count);

    /**
     * 根据商品分类获取商品列表
     * @param categoryId    商品分类的ID
     * @param orderBy       排序方式，值为SQL代码
     * @param page          获取第几页的数据
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    List<Goods> getGoodsListByCategoryId(
            Integer categoryId,
            String orderBy,
            Integer page);

    /**
     * 根据商品分类获取商品列表
     * @param categoryId    商品分类的ID
     * @param page          获取第几页的数据
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    List<Goods> getGoodsListByCategoryId(
            Integer categoryId,
            Integer page);

    /**
     * 根据商品分类获取商品列表，只显示第1页的数据
     * @param categoryId    商品分类的ID
     * @param orderBy       排序方式，值为SQL代码
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    List<Goods> getGoodsListByCategoryId(
            Integer categoryId,
            String orderBy);

    /**
     * 根据商品分类获取商品列表，按照默认的排序方式（根据优先级）进行排序，只显示第1页的数据
     * @param categoryId    商品分类的ID
     * @return              商品列表，如果没有匹配的数据，则返回长度为0的List集合
     */
    List<Goods> getGoodsListByCategoryId(
            Integer categoryId);

    /**
     * 获取某分类的商品的总数量
     * @param categoryId    分类的id
     * @return              商品的数量
     */
    Integer getGoodsCountByCategoryId(Integer categoryId);

    /**
     * 根据商品id获取商品信息
     * @param id    商品id
     * @return      返回商品信息
     */
    Goods getGoodsById(Integer id);

    /**
     * 根据item_type获取商品列表
     * @param itemType  商品item_type
     * @return          返回商品列表
     */
    List<Goods> getGoodsListByItemType(String itemType);

}
